#!/usr/bin/python2
# -*- coding: utf-8 -*-
import pylab,sympy
from matplotlib.pyplot import savefig

class Curve:
    u"""Рисует профиль для отражателя по входным данным:
    Q - суммарная ширина светильника
    d - диаметр лампы
    n - количество ламп
    h - запас высоты отражателя"""
    def __init__( self, Q=400, d=12.7, n=4, h=15, curve_type = 'parabola' ):
        self.Q = Q
        self.d = d
        self.n = n
        self.h = h
        self.curve_type = curve_type

        self.T=self.Q/self.n
        self.w=self.T/2
        self.r=self.d/2
        self.k=(self.d+self.h+sympy.sqrt((self.d+self.h)**2+self.w**2))/(2*self.w**2)
    
        self.X=0
        self.F=(0.25/self.k)
        self.Y=self.F+self.r
    
        self.XK=[-self.w, -self.w, self.w, self.w]
        self.Yk=(0.25/self.k)+2*self.r+self.h
        self.YK=[0,-self.Yk,-self.Yk,0]
    
        self.x=pylab.arange(-self.w,self.w,0.01)

        if (curve_type == 'parabola'):
            self.y=-self.k*(self.x**2)

        sympy_x=sympy.symbols('x')
        self.L=sympy.integrate(sympy.sqrt(1+(self.k**2)*4*sympy_x**2), (sympy_x, -self.w, self.w))
        self.an=pylab.linspace(0,2*pylab.pi,100)

        self.ploted = False

    def plot(self, parent=pylab):
        font = { 'fontname':'Droid Sans' }
        parent.plot([self.X,self.X], [-self.F,-self.Y], marker='o', linestyle='None', color='r')
        parent.text(self.X, -self.F, ' F={0}'.format(round(self.F,2)), horizontalalignment='left', verticalalignment='bottom', **font)

        parent.plot(self.XK,self.YK, linestyle='--', color='g')
        parent.text(-self.w,-self.Yk, ' X={0}'.format(round(-self.w,2)), **font)
        parent.text(self.X,-self.Yk, ' Y={0}'.format(round(self.Yk,2)), horizontalalignment='center', **font)
        parent.text(self.w,-self.Yk, ' X={0}'.format(round(self.w,2)), horizontalalignment='right', **font)

        parent.text(0,0, u' коэффициент k={0},\n ширина отражателя L={1}\n'.format(round(self.k,6),round(self.L,2)), **font)
        parent.plot ((self.r*pylab.cos(self.an))+self.X, (self.r*pylab.sin(self.an))-self.Y)

        parent.plot ([self.X,-self.w],[-(self.F+self.d),-self.Yk], linestyle='--', color='y') 
        parent.plot ([self.X,self.w],[-(self.F+self.d),-self.Yk], linestyle='--', color='y') 

        parent.axis('equal')
        parent.plot(self.x, self.y, color='m')
        if hasattr(parent, '__name__'):
            if parent.__name__ == 'pylab':
                parent.xlabel('x-axis')
                parent.ylabel('y-axis')
                parent.title(u'Тип кривой: {0}'.format(self.curve_type), **font)
        parent.grid(True)
        self.ploted = True

    def show(self):
        if not self.ploted:
            self.plot()
        pylab.show()

if __name__ == "__main__":
    import argparse
    parser = argparse.ArgumentParser(description=u'Рассчёт и построение параболы отражателя.')
    parser.add_argument('Q', type=int, help=u'суммарная ширина светильника')
    parser.add_argument('d', type=float, help=u'диаметр лампы')
    parser.add_argument('n', type=int, help=u'количество ламп')
    parser.add_argument('h', type=int, help=u'запас высоты отражателя')
    args = vars(parser.parse_args())
    print args
    C = Curve(args['Q'], args['d'], args['n'], args['h'])
    C.show()
